<?php
/*
* Este es un draft para una aplicación de importación de listas y atributos,
* se busca generar una primera experiencia que sirva para modelar casos.
*
* MODELO:
* -------
*
* email ; firstname ; lastname ; attributes
*
*
* 1. generar un excel con los campos email ; firstname ; lastname ; attributes
*    El campo attributes serán palabras clave separadas por espacios, comas o cualquier otra cosa que
*    se interpretarán según el array definido aqui abajo.
*
* 2. La tabla contactos puede tener 3 casos para el tratamiento de atributos:
*
*    a) cada contacto tiene "atributos_enumerados" separados por comas.
*       este podría ser el caso si importamos desde una base de datos que estaba normalizada con n-m.
*       ej: atributo 1, atributo 2 | email@contacto
*
*    b) cada contacto tiene asociada una lista que se convertirá en n atributos, según ciertas "palabras_clave".
*       ej: alumnos que cursaron en santa fe | email@contacto
*       ==> alumnos = 1  //  localidad = santa fe  //  alumno presencial = 1
*
*    c) cada contacto tiene una serie de columnas "atributo_nombre" con información homogenea pero muy variada.
*       ej: atributo_cp | atributo_profesion | atributo_localidad | email@contacto
*
* 3. Crear un registro en la tabla "catalog" por cada catálogo (lista) que se quiera crear,
*    el sistema agregará automáticamente a todos los usuarios en todos los catálogos creados.
*/

define('LOG_FILE', 'importer.log');
define('LOG_INVALIDS', 'invalid_emails.log');

error_reporting(E_ALL | E_STRICT); //For PHP 6 E_STRICT become part of E_ALL
ini_set('display_errors', 'Off');
ini_set('log_errors', 'On');
ini_set('error_log', LOG_FILE);

ini_set("memory_limit","500M");
set_time_limit(0); // unlimited

require("excel.reader.class.php");
require("../daemons/lib/db.broker.php");

	echo("--------------------------------" . "\r\n");
	echo("ABRIENDO EXCEL ..." . "\r\n");

$client_id 	= $argv[1];
$excel_file = $argv[2];

$excel 			= new Spreadsheet_Excel_Reader($excel_file);
$sheet 			= 0;
$rowfrom 		= 2; // evitamos la primera linea que tiene titulos
$rowto 			= $excel->rowcount($sheet);

$claves = array(
	"periodista" => array("periodista","1"),
);

$db = New broker;
$db->connect();

/*
// esto es sólo porque la creación dinámica de atributos no está lista
// creamos el atributo y obtenemos su ID
$insert_sql = "
	INSERT INTO `attributes` (`name`, `client_id`, `type`) 
	VALUES ('cod-postal', '{$client_id}', 'text')
";
$cp_attribute_id = $db->insert($insert_sql);
*/

// definimos una clase para despues crear objetos y manejar más fácil los datos dentro del sql
class Contacto {}


// generamos un array con los recipients actuales del cliente, 
// para no agregar un contacto que ya exista
$recipients_sql = "
	SELECT email FROM recipients
	WHERE (client_id = {$client_id})
";
$res_cipients = $db->query($recipients_sql);
$recipients = array();
foreach ($res_cipients as $recipient) {
	array_push($recipients, $recipient["email"]);
}
unset($res_cipients);


if ($rowto) {

	echo("PROCESANDO {$rowto} REGISTROS..." . "\r\n");
	echo("--------------------------------" . "\r\n");

	for($row = $rowfrom; $row <= $rowto; $row++) {
		// crear_contacto
		$contacto = new Contacto();
		$contacto->client_id 	= $client_id;
		$contacto->email 			= trim($excel->val($row,1,$sheet));
		$contacto->firstname 	= trim($excel->val($row,2,$sheet));
		$contacto->lastname 	= trim($excel->val($row,3,$sheet));
		$contacto->nickname 	= "";
		$contacto->claves		 	= trim($excel->val($row,4,$sheet));
		$contacto->validated 	= 1;

		echo("\r" . $row . " " . $contacto->email); // mostramos el email que se esta procesando

		if (! in_array ($contacto->email, $recipients )) {

			$id = crear_contacto($contacto);

			if ($id) {
				array_push($recipients, $contacto->email); // esto es para evitar que se cargue de nuevo el mismo email
				//procesar_atributos_enumerados($id, $contacto['atributos_enumerados']);
				procesar_palabras_clave($id, $contacto->claves, $claves);
				//procesar_atributos_nombre($cp_attribute_id, $id, $contacto);
				agregar_catalogos($id);
			}
			else {
				// agregamos el contacto a la lista de no procesados
				$rowlog = "'{$contacto->email}','{$contacto->firstname}','{$contacto->lastname}','{$contacto->claves}'\r\n";
				error_log($rowlog,3,LOG_INVALIDS);
			}
		}
		// pisamos con blancos la pantalla con el email que se estaba procesando
		echo("\r" . "                                                            ");
	}

} // if contactos



function crear_contacto($contacto) {
	global $db;

	// validar email
	$id = 0; // predeterminamos false
	if (valid_email_address($contacto->email)) {

		// insertar en recipients
		$insert_sql = "
		INSERT INTO `recipients` 
		(`client_id`, `email`, `firstname`, `lastname`, `nickname`, `created`, `validated`) 
		VALUES (
			'{$contacto->client_id}', '{$contacto->email}', '{$contacto->firstname}', 
			'{$contacto->lastname}', '{$contacto->nickname}', NOW(), '{$contacto->validated}'
		)
		";
		$id = $db->insert($insert_sql);
	}
	
	return $id;
}


function valid_email_address($email) {
//	if(filter_var($email,FILTER_VALIDATE_EMAIL) === false) return false;
//	else return true;
		return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $email)) ? FALSE : TRUE;
}	


/*
* cada contacto tiene "atributos_enumerados" separados por comas.
* este podría ser el caso si importamos desde una base de datos que estaba normalizada con n-m.
* ej: atributo 1, atributo 2 | email@contacto
function procesar_atributos_enumerados($id, $atributos_enumerados) {
	global $db;
	$atributos = explode(",", $atributos_enumerados);
	if (count($atributos) && strlen($atributos_enumerados)) {
		foreach ($atributos as $atributo) {
			$atributo = trim($atributo);
			$db->insert("INSERT INTO `attributes` (`name`, `value`, `recipient_id`) VALUES ('{$atributo}', '1', '{$id}')");
		}
	}
}
*/


/*
* cada contacto tiene asociada una lista que se convertirá en n atributos, según ciertas "palabras_clave".
* ej: alumnos que cursaron en santa fe | email@contacto
* ==> alumnos = 1  //  localidad = santa fe  //  alumno presencial = 1
*/
function procesar_palabras_clave($id, $palabras_clave, $claves) {
	global $db;
	global $client_id;

  $atributos = array();

  while( key($claves) !== NULL ) {
    if ( stristr($palabras_clave, utf8_decode(key($claves))) ) {
    	$atributo = current($claves);
      $unAtributo = array(
        'name' => $atributo[0],
        'value' => utf8_decode($atributo[1])
      );
      array_push($atributos, $unAtributo);
    }
    next($claves);
  }

  if(count($atributos)) {
	  foreach ($atributos as $atributo) {
		  $name = $atributo["name"];
		  $value = $atributo["value"];

		  // nos basamos en el valor para establecer el tipo del atributo
		  // esto después podría evolucionar, pero por ahora alcanza
		  if ($value == "1" || $value == "0") $type = "boolean";
		  else $type = "text";

		  // chequeamos si existe un atributo con ese nombre y obtenemos su ID
		  // si no existe lo creamos y le asignamos el tipo
		  $attribute_sql = "
		  	SELECT id FROM attributes
		  	WHERE (name = '{$name}') AND (client_id = {$client_id})
		  ";
		  $res = $db->query($attribute_sql);
		  if (count($res)) $attribute_id = $res[0]["id"];
		  else {
				$insert_sql = "
					INSERT INTO `attributes` (`name`, `client_id`, `type`) 
					VALUES ('{$name}', '{$client_id}', '{$type}')
				";
				$attribute_id = $db->insert($insert_sql);
		  }

		  // insertar un valor para el atributo
			$insert_sql = "
				INSERT INTO `attrvalues` (`value`, `attribute_id`, `recipient_id`) 
				VALUES ('{$value}', '{$attribute_id}', '{$id}')
			";
			$db->insert($insert_sql);
	  }
	}

}


/*
* cada contacto tiene una serie de columnas "atributo_nombre" con información homogenea pero muy variada.
* ej: atributo_cp | atributo_profesion | atributo_localidad | email@contacto
function procesar_atributos_nombre($attribute_id, $id, $contacto) {
	global $db;

	// ***************************************************
	// FALTA HACER, ahora sólo funciona para código postal 
	// ***************************************************

	$cp = $contacto["atributo_cp"];
	if ($cp) {
		$insert_sql = "
			INSERT INTO `attrvalues` (`value`, `attribute_id`, `recipient_id`) 
			VALUES ('{$cp}', '{$attribute_id}',  '{$id}')
		";
		$db->insert($insert_sql);
	}	
}
*/


// agrega el recipient a todos los catalogos del cliente
function agregar_catalogos($id) {
	global $db;
	global $client_id;

	$insert_sql = "
		INSERT INTO subscribers (recipient_id, catalog_id, subscribed)
		(SELECT {$id} as recipient_id, id as catalog_id, NOW() as subscribed FROM catalogs WHERE client_id = {$client_id})
	";
	$id = $db->insert($insert_sql);
}
